package org.example.ai04.controller;

import org.example.ai04.dto.LoginRequest;
import org.example.ai04.dto.RegisterRequest;
import org.example.ai04.entity.User;
import org.example.ai04.service.UserService;
import org.example.ai04.util.JwtUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * 认证控制器
 * 提供用户登录和注册功能的API接口
 * 无需认证即可访问（根据SecurityConfig配置）
 * 主要功能包括用户身份验证、JWT令牌生成和用户注册
 */
@RestController
@RequestMapping("/api/auth")
public class AuthController {

    // 注入用户服务，用于用户数据处理（注册、查询等）
    @Autowired
    private UserService userService;

    // 注入JWT工具，用于生成和验证JWT令牌
    @Autowired
    private JwtUtil jwtUtil;

    // 注入认证管理器，用于处理身份验证请求
    @Autowired
    private AuthenticationManager authenticationManager;

    /**
     * 用户登录接口
     * 接收用户名和密码，验证身份并返回JWT令牌
     * @param loginRequest 登录请求，包含用户名和密码
     * @return 成功时返回包含JWT令牌和用户信息的200响应，失败时返回400响应
     */
    @PostMapping("/login")
    public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest) {
        try {
            // 使用认证管理器进行身份验证
            // 创建用户名密码认证令牌并提交给认证管理器
            Authentication authentication = authenticationManager.authenticate(
                new UsernamePasswordAuthenticationToken(
                    loginRequest.getUsername(),
                    loginRequest.getPassword()
                )
            );
            
            // 将认证结果设置到安全上下文中
            // 这样在当前请求线程中可以访问已认证的用户信息
            SecurityContextHolder.getContext().setAuthentication(authentication);
            
            // 获取用户完整信息
            User user = userService.findByUsername(loginRequest.getUsername());
            // 生成JWT令牌，包含用户名和角色信息
            String token = jwtUtil.generateToken(user.getUsername(), user.getRole());
            
            // 构建响应数据，包含JWT令牌和用户基本信息
            Map<String, Object> response = new HashMap<>();
            response.put("token", token); // JWT访问令牌
            response.put("username", user.getUsername()); // 用户名
            response.put("role", user.getRole()); // 用户角色
            response.put("id", user.getId()); // 用户ID
            
            return ResponseEntity.ok(response);
        } catch (Exception e) {
            // 捕获所有异常，包括用户名不存在、密码错误等
            // 登录失败，返回友好的错误信息
            return ResponseEntity.badRequest().body(Map.of("message", "用户名或密码错误"));
        }
    }

    /**
     * 用户注册接口
     * 接收用户注册信息，创建新用户并返回注册结果
     * @param registerRequest 注册请求，包含用户名、邮箱和密码
     * @return 成功时返回包含成功消息的200响应，失败时返回400响应
     */
    @PostMapping("/register")
    public ResponseEntity<?> register(@RequestBody RegisterRequest registerRequest) {
        try {
            // 创建用户对象并设置基本信息
            User user = new User();
            user.setUsername(registerRequest.getUsername()); // 设置用户名
            user.setEmail(registerRequest.getEmail()); // 设置邮箱
            user.setPassword(registerRequest.getPassword()); // 设置原始密码（将在服务层加密）
            user.setRole("USER"); // 新用户默认为普通用户角色
            
            // 调用用户服务进行注册
            // 服务层会负责密码加密、唯一性检查等逻辑
            User savedUser = userService.register(user);
            
            // 构建响应数据，包含成功消息和创建的用户名
            Map<String, Object> response = new HashMap<>();
            response.put("message", "注册成功，请登录");
            response.put("username", savedUser.getUsername());
            
            return ResponseEntity.ok(response);
        } catch (RuntimeException e) {
            // 捕获运行时异常，主要是用户名或邮箱已存在的情况
            // 注册失败，返回具体的错误信息
            return ResponseEntity.badRequest().body(Map.of("message", e.getMessage()));
        }
    }

}